package fr.uparis10.miage.m1p1.employes;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.Iterator;

import fr.uparis10.miage.m1p1.core.Projet;
import fr.uparis10.miage.m1p1.exceptions.ProjetException;

public class DirecteurProjet extends Manager {
	private ArrayList<Projet> lesProjets;
	private double mBudgetUsed = 0;

	/* Constructors - START */
	/**
	 * Constructeur par d�faut. Allocation de la liste de projets.
	 */
	public DirecteurProjet() {
		super();
		lesProjets = new ArrayList<Projet>();
	}

	/**
	 * Constructeur initialis� avec un projet. Allocation de la liste de
	 * projets.
	 * 
	 * @param p
	 */
	public DirecteurProjet(Projet p) {
		super();
		lesProjets = new ArrayList<Projet>();
		lesProjets.add(p);
	}

	/**
	 * Constructeur initialis� avec une liste de porjets. Allocation de la liste
	 * de projets.
	 * 
	 * @param pListe
	 */
	public DirecteurProjet(ArrayList<Projet> pListe) {
		super();
		lesProjets = new ArrayList<Projet>();
		lesProjets.addAll(pListe);
	}

	public DirecteurProjet(int preferedEmplId, long preferedNumSS) {
		super(preferedEmplId, preferedNumSS);
	}

	public DirecteurProjet(int preferedEmplId, long preferedNumSS, Date joinDate) {
		super(preferedEmplId, preferedNumSS, joinDate);
	}

	public DirecteurProjet(int preferedEmplId, long preferedNumSS,
			Date joinDate, double budget, Date dateNomination) {
		super(preferedEmplId, preferedNumSS, joinDate, budget, dateNomination);
	}

	/* Constructors - END */

	/**
	 * Recherche si le projet est suivi par le Directeur de projets.
	 * 
	 * @return True: Si suivi, False: Si non suivi.
	 */
	public boolean estSuivi(Projet proj) {
		Iterator<Projet> iter = lesProjets.iterator();
		for (Projet p = null; iter.hasNext();) {
			p = iter.next();
			if (proj.getThemeProjet().equals(p.getThemeProjet())) {
				return true;
			}
		}
		return false;
	}

	/**
	 * Permet de faire la demande de suivi d'un nouveau projet.
	 * 
	 * @param p
	 * @throws ProjetException
	 */
	public void suivreProjet(Projet p) throws ProjetException {
		long currentDateMilis = Calendar.getInstance().getTime().getTime();
		// is the project still & already running?
		if (p.getDateDebut().getTime() > currentDateMilis) {
			// the project isn't started, yet
			throw new ProjetException("Le projet " + p.getThemeProjet()
					+ " n'est pas encore commenc\u00e9");
		}
		if (currentDateMilis > p.getDateFin().getTime()) {
			// it's over
			throw new ProjetException("Le projet " + p.getThemeProjet() + " est finit");
		}

		DirecteurDepartement dirDep = this.getDepartement().getDirecteurDepartement();
		if (dirDep.donnerAccord(p)) {
			lesProjets.add(p);
		} else {
			throw new ProjetException(
					"Le Directeur de Departement a refuse de donner l'accord");
		}

		// well, the Project "wants" to know the list of his employees
		p.addEmploye(this);
	}

	/**
	 * Permet d'abandonner le suivi d'un projet.
	 * 
	 * @param p
	 */
	public void abandonProjet(Projet p) {
		if (!lesProjets.remove(p)) {
			throw new ProjetException("Le directeur " + getNom()
					+ " ne suit pas le projet " + p.getThemeProjet());
		}
		// end of work for this project
		p.removeEmploye(this);
	}

	/**
	 * Permet de calculer le bonus de salaire.
	 */
	public int calcBonus() {
		double bonusRate;
		switch (indice) {
		case A:
			bonusRate = 0.13;
			break;
		case B:
			bonusRate = 0.08;
			break;
		default:
			bonusRate = 0;
		}
		double bonus = salaire * bonusRate;
		return (int) bonus;
	}

	/**
	 * Our dear director must be able to give us some budget
	 * 
	 * @param requestedBudget
	 *            - how much do you need?
	 * @param reason
	 *            - why do you need the money?
	 * @return some budget, in EUR
	 */
	@Override
	public double requestBudget(double requestedBudget, String reason) {
		/*
		 * this guys decisions are usually Crazy, so the accept/refuse will
		 * depend on the Reason ;-)
		 */
		double availableBudget = budgetAnnuel - mBudgetUsed;
		double allowedBudget = (availableBudget > requestedBudget ? requestedBudget
				: availableBudget)
				* (reason.hashCode() % 2); // either Yes or no ;-)

		mBudgetUsed += allowedBudget;

		return allowedBudget;
	}

}